package user.blog;

import java.util.List;

import exceptions.InvalidIdException;
import exceptions.post.InvalidTitleException;
import exceptions.post.NonExistentPostException;

import user.UserIF;
import user.post.*;

public interface BlogIF {

	/**
	 * Retorna o titulo do Blog.
	 */
	public abstract String getTitle();

	/**
	 * Modifica o titulo do Blog.
	 */
	public abstract void setTitle(String title) throws Exception;

	/**
	 * Seta o dono do Blog.
	 */
	public abstract void setOwner(String owner);

	/**
	 * Retorna o dono do Blog.
	 */
	public abstract String getOwner();

	/**
	 * Retorna a descricao do Blog.
	 */
	public abstract String getDescription();

	/**
	 * Seta a descricao do Blog.
	 */
	public abstract void setDescription(String description);

	/**
	 * Retorna uma lista com os subBlogs do Blog.
	 */
	public abstract List<Blog> getSubBlogs();

	/**
	 * Adiciona um sub blog.
	 */
	public abstract String addSubBlog(String title, String description)
			throws Exception;

	/**
	 * Remove um sub blog.
	 */
	public abstract void removeSubBlog(String title);

	/**
	 * Retorna a ID do Blog.
	 */
	public abstract String getId();

	/**
	 * Adiciona um Post ao Blog.
	 */
	public abstract String addPost(String title, String text)
			throws InvalidTitleException;

	/**
	 * Retorna um post de Blog pela sua ID.
	 * 
	 * @throws InvalidIdException
	 *             Se o argumento passado for nulo, vazio ou nao numerico.
	 * @throws NonExistentPostException 
	 */
	public abstract Post getPostByPID(String pid) throws InvalidIdException, NonExistentPostException;

	/**
	 * Remove um post de Blog.
	 */
	public abstract void removePost(String pid) throws Exception;

	/**
	 * Fornece o PostManager de um blog.
	 * @return
	 */
	PostManager getPostManager();
	/**
	 * Adiciona um notificador
	 * @param user
	 */
	public abstract void addListener(UserIF user);
	
	public abstract List<UserIF> getNotificadores();

	String getPostInformation(String flag) throws Exception;
}